/**
 * 
 */
package fr.gfi.agraf.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import fr.gfi.agraf.exception.AgrafException;
import fr.gfi.agraf.persistence.dao.IComposantDAO;
import fr.gfi.agraf.persistence.entity.Composant;
import fr.gfi.agraf.service.IComposantService;
import fr.gfi.agraf.service.IProfilService;
import fr.gfi.agraf.service.mapper.ComposantMapper;
import fr.gfi.agraf.vue.bean.ComposantDTO;
import fr.gfi.agraf.vue.bean.ProfilDTO;

/**
 * @author Zakaria
 *
 */
@Service("ComposantService")
@Transactional(propagation = Propagation.REQUIRED)
public class ComposantService implements IComposantService {

	@Autowired
	private IComposantDAO composantDAO;

	@Autowired
	private IProfilService profilService;

	/*
	 * (non-Javadoc)
	 * 
	 * @see fr.gfi.agraf.service.IComposantService#getAllComposant()
	 */
	public List<ComposantDTO> getAllComposant() throws AgrafException {
		final List<Composant> composantList = composantDAO.listerTous();
		if (CollectionUtils.isEmpty(composantList)) {
			throw new AgrafException("");
		}
		return ComposantMapper.entityToDTOList(composantList);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * fr.gfi.agraf.service.IComposantService#getAllComposantToModifyProfil(int)
	 */
	public List<ComposantDTO> getAllComposantToModifyProfil(final Long idProfil) throws AgrafException {
		// récupere tous les composants
		final List<ComposantDTO> allComposants = getAllComposant();
		// récupere le profil et ses composants
		final ProfilDTO profil = profilService.getProfilById(idProfil);
		final List<ComposantDTO> listeComposantProfil = profil.getListeComposantDTO();
		for (final ComposantDTO composant : allComposants) {
			// si le profil posséde déjà le composant alors on le met a checked
			if (listeComposantProfil.contains(composant)) {
				composant.setChecked(true);
			}
			
			// Informations inutiles pour le traitement
			composant.setCategorieComposantDTO(null);
			composant.setNomAction(null);
		}
		return allComposants;
	}

	/**
	 * @return the composantDAO
	 */
	public IComposantDAO getComposantDAO() {
		return composantDAO;
	}

	/**
	 * @param composantDAO
	 *            the composantDAO to set
	 */
	public void setComposantDAO(final IComposantDAO composantDAO) {
		this.composantDAO = composantDAO;
	}

}
